package ink.lovejinhu.leetcode;

import ink.lovejinhu.common.TreeNode;

/**
 * @author jinhu
 * created 2021-06-25 15:07
 */
public class Solution_0112 {
    /**
     * 给你二叉树的根节点root 和一个表示目标和的整数targetSum ，判断该树中是否存在 根节点到叶子节点 的路径，这条路径上所有节点值相加等于目标和 targetSum
     * <p>
     *
     * @param root
     * @param targetSum
     * @return
     */
    public boolean hasPathSum(TreeNode root, int targetSum) {

        return isEqual(root, targetSum, 0);
    }

    public boolean isEqual(TreeNode root, int targetSum, int result) {
        if (root == null) {
            return false;
        }
        result += root.val;
        if (root.left == null && root.right == null) {
            if (result == targetSum) {
                return true;
            }
        }
        return isEqual(root.left, targetSum, result) || isEqual(root.right, targetSum, result);
    }

//    public boolean hasPathSum(TreeNode root, int sum) {
//        if (root == null) {
//            return false;
//        }
//        if (root.left == null && root.right == null) {
//            return sum - root.val == 0;
//        }
//        return hasPathSum(root.left, sum - root.val)
//                || hasPathSum(root.right, sum - root.val);
//    }
//    /**
//     * 我把result定义为它子树的结果，这是不对的,按照上面好理解
//     *
//     * @param root
//     * @param targetSum
//     * @param result
//     * @return
//     */
//    public ResultData isEqual(TreeNode root, int targetSum, int result) {
//        if (root == null) {   //证明上一步已经是叶子节点了，或者是这个二叉树本身就是一个空
//            if (targetSum == result) {
//                return new ResultData(result, true);
//            }
//            return new ResultData(0, false);
//        }
//        //走左子树的结果
//        int left = root.val + this.isEqual(root.left, targetSum, result).result;
//        if (left == targetSum) {
//            return new ResultData(result, true);
//        }
//        int right = root.val + this.isEqual(root.right, targetSum, result).result;
//        if (right == targetSum) {
//            return new ResultData(result, true);
//        }
//        return null;
//
//    }

    class ResultData {
        public int result;
        public boolean flag;

        public ResultData(int result, boolean flag) {
            this.result = result;
            this.flag = flag;
        }
    }


}
